package chwgigs;

public class J26_TypeCasting {

	// 모든 클래스의 조상
	// 모든 클래스는 자동적으로 java.lang.Object를 확장함
	// 즉 ,object 클래스는 궁극적으로 자바에서 super클래이다.
	// 기본적으로 Object클래스에는 7개의 메서드가 정의되어 있고
	// 하위 클래스에서는 이것을 재정의해서 적절히 사용가능 하다.

	// equals -기존 객체와 매개변수로 전달된 객체와 비교
	// 겍채 비교가 제대로 이뤄질려면 메서드를 저정의하고 구현해야 한다

	// hashcode- 객체의 해시코드를 출력한다. 객체는 일반적으로 heap 에 생성됨
	// heap에 생성된 객체의 메모리 주소를 바탕으로 만들어지는 유일한 코드값을 의미한다

	// toString- 객체에 대한 설명을 출력한다.

	public static void main(String[] args) {
		Object obj = new Object();

		J25_Animal a = new J25_Animal();
		J25_fish f = new J25_fish();
		a = new J25_fish();

		// fish는 Animal를 확장했기 때문에
		// Animal 객체에 fish객체를 받을 수 있다.
		// 하위 객체를 상위 객체로 cast 하는 경우
		// 이것을 upcasting 이라 한다.

		// f=(J25_fish)new J25_Animal();

		// 상위 객체를 하위 객체로 cast 하는 경우

		// 이것을 downcasting 이라 한다.
		// 이때 마치 형변환처럼 명시적으로 괄호 안에
		// cast 할 클래스 자료명을 명시해야 한다

		// *중요!!*
		// <다형성>을 근거로 테란유닛 생산 (upcasting)
		// 즉, marine 유닛은 상황에 따라
		// Terranunit 도 될 수 있다는 의미

		// 다형성 polymorphism

		// OOP의 중요 개념 중 하나
		// 특정 유형의 변수가 상황에 따라 다양한 유형의 변수로
		// 바뀔 수 있는 특성을 의미
		// 다양한 유형의 요소로 바뀔 수 있는 특성을 의미한다.
		// 주로 상속관계에 있는 클래스 간에서
		// 나타나는 특별한 성질이다

		// is-a 관계 확인
		// 특정 객체가 어떤 유형과 동일한지 또는 상속 관계인지 알아 볼때
		// instanceof 예약어를 사용

		Terranunit t1 = new marine(); // 상속을 했기 때문에 부모 클래스의 객체를 받을 수 있다.
		t1.sayunit();       // upcasting
		t1.sayunit((marine) t1); // down casting , 즉 t1dl 테란유닛에 있는 객체이기 때문에 마린으로
									// 형변환 해야한다

		Terranunit t2 = new firebat();
		t2.sayunit();
		t2.sayunit((firebat) t2);

		Terranunit t3 = new medic();
		t3.sayunit();
		t3.sayunit((medic) t3);
		//
	
		allianceunit t11 = new human();
		allianceunit t21 = new wolf();
		allianceunit t31 = new nom();

		// 객체 유형 확인하기
	/*	
		J26_TypeCasting t = new J26_TypeCasting();
		if (t instanceof java.lang.Object) {
			System.out.println("t는 object의 자손");
		}
		if (m1 instanceof Terranunit) {
			System.out.println("해병은 테란유닛의 자손object의 자손");
		}

		if (m1 instanceof marine) {
			System.out.println("m1은 해병임 ");
		}*/
                       
	}//

}// main class

class Terranunit { // 부모 클래스
	public void sayunit() {
		System.out.println("I'm your father");
	}

	public void sayunit(marine m) {
		System.out.println("I'm marine");
	}

	public void sayunit(firebat m) {
		System.out.println("I'm firbat");
	}

	public void sayunit(medic m) {
		System.out.println("I'm medic");
	}

} //

class marine extends Terranunit { }

class firebat extends Terranunit {}

class medic extends Terranunit {}

//

class allianceunit {} // 부모

class human extends allianceunit {} // 상속

class wolf extends allianceunit {}

class nom extends allianceunit {}
